package com.sifang.netty.chat;

import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.channel.group.ChannelGroup;
import io.netty.channel.group.DefaultChannelGroup;
import io.netty.util.concurrent.GlobalEventExecutor;

import java.text.SimpleDateFormat;
import java.util.Date;

public class ChatServerHandler extends SimpleChannelInboundHandler<String> {
    //GlobalEventExecutor.INSTANCE 是全局的事件执行器，是一个单例，记录所有已在线的连接
    private static ChannelGroup channelGroup = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);
    //日期格式化器
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    /**
     * 如果连上服务端，触发channelActive方法
     * @param ctx  上下文对象, 含有通道channel，管道pipeline
     */

    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        //获取channel
        Channel channel = ctx.channel();

        //把当前客户端上线信息 推送到其他已在线的客户端
        // 1. writeAndFlush()遍历channelGroup所有已在线的客户端
        channelGroup.writeAndFlush("[ 客户端 ]"+channel.remoteAddress().toString().substring(1)+" 上线了! "+sdf.format(new Date())+"\n");

        // 2. 把当前channel连接加入到channelGroup中去
        channelGroup.add(channel);

        //服务器端打印客户端上线信息
        System.out.println(channel.remoteAddress().toString().substring(1)+" 上线了! "+"\n");
    }

    @Override
    public void channelInactive(ChannelHandlerContext ctx) throws Exception {
        //获取channel
        Channel channel = ctx.channel();
        //客户端下线信息发送给其他客户端
        channelGroup.writeAndFlush("[ 客户端 ]"+channel.remoteAddress().toString().substring(1)+" 下线了! "+"\n");
        //服务器端打印客户端下线信息
        System.out.println(channel.remoteAddress().toString().substring(1)+" 下线了! 还剩余："+channelGroup.size()+" 个客户端！"+"\n");

    }

    @Override
    protected void channelRead0(ChannelHandlerContext channelHandlerContext, String msg) throws Exception {

        //获取当前channel
        Channel channel = channelHandlerContext.channel();
        channelGroup.forEach(x -> {
            if (channel != x) {
                x.writeAndFlush("[ 客户端 ]" + channel.remoteAddress().toString().substring(1) + " 发送了消息：" + msg + "\n");
            }else {
                x.writeAndFlush("[ 自己 ]发送了消息：" + msg + "\n");
            }
        });
    }
}
